const {
	Service
} = require('uni-cloud-router')

const uidObj = require('uni-id');

module.exports = class UtilsService extends Service {

	constructor(ctx) {
		super(ctx)
	}

	/**
	 * 日期格式化，默认为 'yyyy-MM-dd hh:mm:ss'
	 */
	formatdate(date, fmt) {
		date = this.toDate(date);

		fmt = fmt || 'yyyy-MM-dd hh:mm:ss'
		let o = {
			"M+": date.getMonth() + 1, //月份
			"d+": date.getDate(), //日
			"h+": date.getHours(), //小时
			"m+": date.getMinutes(), //分
			"s+": date.getSeconds(), //秒
			"q+": Math.floor((date.getMonth() + 3) / 3), //季度
			"S": date.getMilliseconds() //毫秒
		};

		if (/(y+)/.test(fmt))
			fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
		for (let k in o)
			if (new RegExp("(" + k + ")").test(fmt))
				fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[
					k]).length)));
		return fmt;
	}
	
	/**
	 * 将日期格式转换为 new Date()
	 */
	toDate(date) {
		if (typeof date === 'string') {
			date = date.replace(/\.|\-/g, '/');
		}
		if (typeof date !== 'object') {
			date = new Date(date);
		}
		
		return date;
	}
	
	// float 格式化，防止 js 精度丢失
	fmtFloat(number) {
		number = parseFloat(number);
		if (isNaN(number)) return number;
		number = parseInt(number.toFixed(2) * 100);
		return number / 100;
	}
	
	// int 格式化（四舍五入），防止 js 精度丢失
	fmtInt(number) {
		number = parseFloat(number);
		if (isNaN(number)) return number;
		
		number = parseInt(number.toFixed(0));
		
		return number;
	}
	
	/**
	 * 将 UTC+0 转换为 UTC+8
	 */
	toDateUTC8(date) {
		date = this.toDate(date);
		if (uniCloud.$provider == 'alipay') {
			// 支付宝云，默认为 UTC+8
			return date;
		}
		
		// 小时 UTC+0 转换为 UTC+8
		date.setHours(date.getHours() + 8);
		return date;
	}

	/**
	 * 过滤特殊字符
	 */
	filterRegexpKey(str) {
		if (!str) return '';
		
		str += '';
		
		const arr = ['\\', '$', '(', ')', '*', '+', '.', '[', ']', '?', '^', '{', '}', '|'];
		
		arr.forEach(x => {
			str = str.replace(new RegExp(`\\${x}`), `\\${x}`);
		});
		
		return str;
	}
	
	/**
	 * 脱敏处理
	 * 	字符类 		
	 * 		2~3个字保留首位 	U**
	 * 		4~5个字保留首尾 	U***m
	 * 		大于5个字保留前3 + *****
	 * 		Use*****
	 * 	手机类 		
	 * 		保留前3后3
	 * 		188*****333
	 * 	邮箱类 		
	 * 		保留前3 + ******.com
	 * 		Use******.com
	 * 	身份证类 	
	 * 		保留前5后3
	 * 		58123**********132
	*/
	desz(str) {
		if (!str) return '';
		str = str.trim();
		const len = str.length;
		
		if (len == 1) return str + '*';
		
		// 字符类
		if (len >= 2 && len <= 3) return str.substr(0, 1).padEnd(len, '*');
		// 4~5个字保留首尾
		if (len >= 4 && len <= 5) return str.substr(0, 1).padEnd(len - 1, '*') + str.substring(len - 1);
		
		// 手机类 保留前3后3
		if (/(^1[0-9][0-9]{9}$)/.test(str)) return str.substr(0, 3).padEnd(len - 3, '*') + str.substring(len - 3);
		
		// todo 邮箱类 
		
		// todo 身份证类
		
		
		// 大于5个字保留前3 + *****
		if (len > 5) return str.substr(0, 3).padEnd(len > 8 ? 8 : len, '*');
	}
}
